"""
-- 6 Задание. Python
-- дан df содержащий количество авторизаций сотрудников по неделям.
-- необходимо посчитать количество авторизаций по каждому сотруднику за каждую неделю и суммарное количество с начала периода.
-- результат отразить в полях cnt и sum
df = pd.DataFrame({'w':[1,1,2,2,2,3,3,3,4,4,4],
                   'user':['User2', 'User3','User1','User1','User2','User2','User2','User3','User1','User1','User3'],
                   'c':[7,2,3,1,2,5,4,6,9,8,7]})

-----------------------------------------------
Входные данные:
w=week        user       cnt
1             User2    7
1             User3    2
2             User1    3
2             User1    1
2             User2    2
3             User2    5
3             User2    4
3             User3    6
4             User1    9
4             User1    8
4             User3    7
-----------------------------------------------
На выходе получаем:
w            user       cnt           sum
1             User1    0              0
1             User2    7              7
1             User3    2              2
2             User1    4              4
2             User2    2              9
2             User3    0              2
3             User1    0              4
3             User2    9              18
3             User3    6              8
4             User1    17             21
4             User2    0              18
4             User3    7              15
-----------------------------------------------
"""

import pandas as pd


def execute_task_6():
    data = {
        'w': [1, 1, 2, 2, 2, 3, 3, 3, 4, 4, 4],
        'user': ['User2', 'User3', 'User1', 'User1', 'User2', 'User2', 'User2', 'User3', 'User1', 'User1', 'User3'],
        'c': [7, 2, 3, 1, 2, 5, 4, 6, 9, 8, 7]
    }

    df = pd.DataFrame(data)

    df_grouped = df.groupby(['w', 'user']).c.sum().reset_index(name='cnt')
    df_grouped['sum'] = df_grouped.groupby('user')['cnt'].cumsum()

    w_user = df_grouped[['w', 'user']].drop_duplicates()

    weeks = w_user['w'].unique()
    users = w_user['user'].unique()
    all_w_user = pd.MultiIndex.from_product([weeks, users], names=['w', 'user']).to_frame(index=False)

    final_df = pd.merge(all_w_user, df_grouped, on=['w', 'user'], how='left')
    final_df.fillna(0, inplace=True)

    final_df.sort_values(by=['w', 'user'], inplace=True)
    final_df.reset_index(drop=True, inplace=True)

    print(final_df)


if __name__ == '__main__':
    execute_task_6()
